<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // bind改变this的指向  

        // function fn(x,y,z){
        //     console.log(this,x,y,z);
        // }
        // // 直接调用 
        // // fn(1,2,3);

        // // 通过bind调用 且 this的指向 
        // var obj = {
        //     name:"张三"
        // }
        // // bind 改变this执行 需要执行2次 ；
        // fn.bind(obj)(1,2,3);

        // fn.call(obj,1,2,3);

        // fn.apply(obj,[1,2,3]);


        // bind的使用场景 ： 某些前提下 ，不能执行函数 但是需要改变函数的指向，函数放在框架或者 底层内部调用 。
        // function fn(){
        //     console.log("点击了",this);
        // }


        // document.onclick = fn.bind(111);




        // 实现一个mybind 

        // function fn(){
        //     console.log("第一次执行")
        //     return function(){
        //         console.log("第二次执行");
        //     }
        // }
        // fn()();

        Function.prototype.mybind = function(arg){
            var argContext = arg || window;  
            argContext = Object(argContext);
            argContext.myfn = this;
            return function(...args){
              var res =   argContext.myfn(...args);
              delete argContext.myfn;
              return res;
            }
        }

        function fn(x,y,z){
            console.log(this,x,y,z)
        }
        fn.mybind({name:"改变this的对象"})(1,2,3)


        // 1.call 、apply 、bind的区别？
        // 2.手写一个mybind函数？
    </script>
</body>
</html>